package com.UKIT.airtickets

import TicketAdapter
import android.view.View
import com.UKIT.airtickets.DB.UserFavoriteDao
import com.UKIT.airtickets.Service.Tikets
import junit.framework.TestCase.assertEquals
import org.junit.Assert
import org.junit.Test
import org.mockito.Mockito
import org.mockito.Mockito.mock

class TicketAdapterTest {

    @Test
    fun testIsInFavorites() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong())).thenReturn(1)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        val result = adapter.isInFavorites(tikets)

        Assert.assertTrue(result)
    }

    @Test
    fun testIsInFavorites_emptyList() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        // Мокируем поведение метода isFavorite для возвращения 0
        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong())).thenReturn(0)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        val result = adapter.isInFavorites(tikets)

        // Проверяем, что результат соответствует ожидаемому значению (false)
        Assert.assertFalse(result)
    }

    @Test
    fun testIsInFavorites_nonExistingElement() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        // Мокируем поведение метода isFavorite для возвращения 0
        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong())).thenReturn(0)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        val result = adapter.isInFavorites(tikets)

        // Проверяем, что результат соответствует ожидаемому значению (false)
        Assert.assertFalse(result)
    }

    @Test
    fun testIsInFavorites_mixedResult() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        // Мокируем поведение метода isFavorite для возвращения значения как 0, так и 1
        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong()))
            .thenReturn(0).thenReturn(1)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        // Проверяем, что результат сначала false, а потом true
        Assert.assertFalse(adapter.isInFavorites(tikets))
        Assert.assertTrue(adapter.isInFavorites(tikets))
    }

    @Test
    fun testIsInFavorites_negativeResultFromDAO() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        // Мокируем поведение метода isFavorite для возвращения 0
        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong())).thenReturn(0)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        val result = adapter.isInFavorites(tikets)

        // Проверяем, что результат соответствует ожидаемому значению (false)
        Assert.assertFalse(result)
    }

    @Test
    fun testIsInFavorites_differentUserId() {
        val userFavoriteDao = Mockito.mock(UserFavoriteDao::class.java)

        // Мокируем поведение метода isFavorite для возвращения 1
        Mockito.`when`(userFavoriteDao.isFavorite(Mockito.anyString(), Mockito.anyLong())).thenReturn(1)

        val adapter = TicketAdapter(mock(), userFavoriteDao)

        val tikets = Tikets(
            searchToken = "searchToken",
            startCity = "startCity",
            startCityCode = "startCityCode",
            endCity = "endCity",
            endCityCode = "endCityCode",
            startDate = "startDate",
            endDate = "endDate",
            price = 100
        )

        // Проверяем, что результатом будет false, так как userId в tikets не совпадает с текущим userId
        Assert.assertFalse(adapter.isInFavorites(tikets))
    }

    @Test
    fun testGetFlightDuration() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-01T12:00:00Z", "2024-05-02T12:00:00Z")

        assertEquals("1 дней 00:00", result)
    }

    @Test
    fun testGetFlightDuration_minutes() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-01T12:00:00Z", "2024-05-01T12:30:00Z")

        assertEquals("30 мин", result)
    }

    @Test
    fun testGetFlightDuration_hours() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-01T12:00:00Z", "2024-05-01T15:30:00Z")

        assertEquals("3 ч 30 мин", result)
    }

    @Test
    fun testGetFlightDuration_daysAndHours() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-01T12:00:00Z", "2024-05-03T15:30:00Z")

        assertEquals("2 дн 3 ч 30 мин", result)
    }

    @Test
    fun testGetFlightDuration_invalidDateFormat() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-01 12:00:00", "2024-05-03 15:30:00")

        assertEquals("", result)
    }

    @Test
    fun testGetFlightDuration_negativeDuration() {
        val itemView = mock<View>()
        val userFavoriteDao = mock<UserFavoriteDao>()
        val viewHolder = TicketAdapter.TicketViewHolder(itemView, userFavoriteDao)

        val result = viewHolder.getFlightDuration("2024-05-03T15:30:00Z", "2024-05-01T12:00:00Z")

        assertEquals("", result)
    }

}
